
import java.awt.event.*;
import java.util.*;
import javax.swing.Timer;

/**
 * <p>
 * Descricao de Porta de Elevador. Supoe-se que juntamente com a abertura e
 * o fechamento da Porta do Elevador tambem se abra e feche a porta do
 * andar em que se encontra o Elevador.
 * </p>
 */
class Porta extends Thread {

  ///////////////////////////////////////
  // attributes


/**
 * <p>
 * Representa o temporizador que vai mensurar o tempo de abertura da Porta.
 * </p>
 */
    private Object temporizador; 

/**
 * <p>
 * Indica se a Porta encontra-se fechada.
 * </p>
 */
    private boolean fechada; 

   ///////////////////////////////////////
   // associations

/**
 * <p>
 * Elevador do qual a Porta e' parte integrante.
 * </p>
 */
    protected Elevador elevador; 


  ///////////////////////////////////////
  // operations


/**
 * <p>
 * Construtor de uma instancia de Porta.
 * </p>
 * 
 * @return uma instancia de Porta.
 * 
 * @param fechada - indica se a Porta encontra-se inicialmente fechada ou
 * nao.
 * 
 * @param elevador 
 */
    public  Porta(boolean fechada, Elevador elevador) {        
        this.fechada = fechada;
        this.elevador = elevador;
        ActionListener taskPerformer = new ActionListener() {
            public void actionPerformed(ActionEvent evt) {
                synchronized(this) {
                    fechar();
                    this.notifyAll();
                }
            }
        };
        Timer temporizador = new Timer(Controlador.aberturaPorta,taskPerformer);
        this.temporizador = temporizador;
    } // end Porta        

/**
 * <p>
 * Abre a Porta do Elevador.
 * </p>
 */
    public void abrir() {        
        fechada = false;
        elevador.notificarEstadoPorta(fechada);
        Timer temporizador = (Timer)this.temporizador;
        if (temporizador.isRunning())
            temporizador.restart();
        else temporizador.start();
    } // end abrir        

/**
 * Does ...
 */
    public void reabrir() {        
        Timer temporizador = (Timer)this.temporizador;
        temporizador.restart();
    } // end reabrir        

/**
 * <p>
 * Fecha a Porta do Elevador.
 * </p>
 */
    private void fechar() {        
        fechada = true;
        ((Timer)temporizador).stop();
        elevador.notificarEstadoPorta(fechada);
        elevador.registrarPortaFechada();
    } // end fechar        

/**
 * <p>
 * Informa se a Porta esta' fechada ou nao.
 * </p>
 * 
 * @return true se a Porta estiver fechada.
 */
    public boolean isFechada() {        
        return fechada;
    } // end isFechada        

/**
 * Does ...
 */
    public void run() {        
        // your code here
    } // end run        

 } // end Porta



